#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/input.h>

#define MAX_DEVICES 64
#define MOUSE_EVENT_KEY BTN_LEFT
#define MOUSE_EVENT_TYPE EV_KEY

// 检查设备是否支持指定的事件类型和事件码
int check_event_support(int fd, unsigned int event_type, unsigned int event_code) {
    unsigned char evbit[EV_MAX / 8 + 1] = {0};
    unsigned char keybit[KEY_MAX / 8 + 1] = {0};

    // 获取设备支持的事件类型
    if (ioctl(fd, EVIOCGBIT(0, sizeof(evbit)), evbit) < 0) {
        perror("EVIOCGBIT");
        return 0;
    }

    // 检查设备是否支持指定的事件类型
    if (!(evbit[event_type / 8] & (1 << (event_type % 8)))) {
        return 0;
    }

    // 获取设备支持的按键事件码
    if (ioctl(fd, EVIOCGBIT(event_type, sizeof(keybit)), keybit) < 0) {
        perror("EVIOCGBIT");
        return 0;
    }

    // 检查设备是否支持指定的事件码
    if (!(keybit[event_code / 8] & (1 << (event_code % 8)))) {
        return 0;
    }

    return 1;
}

int main() {
    char device_path[64];
    int fd;
    int i;

    // 遍历 /dev/input/eventX 设备节点
    for (i = 0; i < MAX_DEVICES; i++) {
        snprintf(device_path, sizeof(device_path), "/dev/input/event%d", i);
        fd = open(device_path, O_RDONLY | O_NONBLOCK);
        if (fd < 0) {
            continue;
        }

        // 检查设备是否支持鼠标左键事件
        if (check_event_support(fd, MOUSE_EVENT_TYPE, MOUSE_EVENT_KEY)) {
            printf("Found mouse device: %s\n", device_path);
            // 这里可以添加对鼠标设备的读取逻辑
            // 例如：可以使用 read 系统调用读取输入事件
        }

        close(fd);
    }

    return 0;
}
